package com.briup.cms.util;




import com.briup.cms.config.exception.ServiceException;
import com.briup.cms.config.response.ResultCode;

import java.lang.reflect.Constructor;
import java.util.function.Consumer;
/**
 * @author 25095
 * @description
 * @data 2024/11/21-14:57
 */
public class AssertUtil {
    /**
     * 期望某个对象为null
     *
     * @param o       对象
     * @param message 对象不为null时，给出的消息提示
     */
    public static void requiredNull(Object o ,String message){
        if (o != null){
            throw new ServiceException(message);
        }
    }
    /**
     * 期望某个对象为null
     *
     * @param o          对象
     * @param resultCode 对象不为null时，抛出统一响应状态
     */
    public static void requiredNull(Object o , ResultCode resultCode){
        if (o != null){
            throw new ServiceException(resultCode);
        }
    }
    /**
     * 期望某个对象不能为null，如果为null抛出异常
     *
     * @param o       对象
     * @param message 对象为null时，抛出的异常
     */
    public static void requiredNotNull(Object o,String message){
        if (o == null){
            throw new ServiceException(message);
        }
    }
    /**
     * 期望某个对象不能为null，如果为null抛出异常
     *
     * @param o          对象
     * @param resultCode 对象为null时，抛出统一响应状态
     */
    public static void requiredNotNull(Object o,ResultCode resultCode){
        if (o == null){
            throw new ServiceException(resultCode);
        }
    }
    /**
     * 期望文本是有数据的
     *
     * @param content 文本对象
     * @param message 文本为空时，抛出的异常消息
     */
    public static void hasTest(String content,String message){
        if (content == null || content.trim().isEmpty()){
            throw new ServiceException(message);
        }
    }
    /**
     * 期望文本是有数据的
     *
     * @param content    文本对象
     * @param resultCode 文本为空时，抛出的异常消息
     */
    public static void hasTest(String content,ResultCode resultCode){
        if (content == null || content.trim().isEmpty()){
            throw new ServiceException(resultCode);
        }
    }
    /**
     * 判断某个boolean表达式为true，
     * 如果为false抛出异常
     *
     * @param expression 表达式
     * @param message    抛出的异常消息
     */
    public static void isTrue(boolean expression,String message){
        if(!expression){
            throw  new ServiceException(message);
        }
    }
    /**
     * 判断某个boolean表达式为true，
     * 如果为false抛出异常
     *
     * @param expression 表达式
     * @param resultCode 抛出的异常消息
     */
    public static void isTrue(boolean expression,ResultCode resultCode){
        if(!expression){
            throw  new ServiceException(resultCode);
        }
    }
    /**
     * 对表达式进行校验，表达式的结果如果为false，那么抛出异常；
     * 异常的类型可以通过Consumer的accept方法指定
     *
     * @param expression boolean表示式
     * @param message    抛出异常时的消息提示
     * @return Consumer接口对象，用于接收需要抛出的异常类型
     */
    public static Consumer<Class<? extends RuntimeException>> check(boolean expression, String message){
        if (!expression){
            return (clazz)->{
                try {
                    Constructor<? extends RuntimeException> constructor =
                            clazz.getDeclaredConstructor(String.class);
                    throw constructor.newInstance(message);
                }catch (Exception e){
                    throw new RuntimeException(e);
                }
            };
        }
        return (clazz)->{};
    }

    public static void main(String[] args) {
        AssertUtil.check(1+1<0,"1+1不可能小于0")
                .accept(RuntimeException.class);
    }
}
